/*
* Copyright 2013 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.android.apps.dashclock.configuration;
import com.google.android.apps.dashclock.ui.PagerPositionStrip;
import net.nurik.roman.dashclock.R;
import android.app.Fragment;
import android.app.backup.BackupManager;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import java.util.HashMap;
import java.util.Map;
/**
* Fragment for allowing the user to configure widget appearance, shown within a {@link
* ConfigurationActivity}.
*/
public class ConfigureAppearanceFragment extends Fragment {
private static final int AUTO_HIDE_DELAY_MILLIS = 1000;
private Handler mHandler = new Handler();
private Map<View, Runnable> mHidePositionStripRunnables = new HashMap<View, Runnable>();
private Map<String, String> mCurrentStyleNames = new HashMap<String, String>();
private int mAnimationDuration;
private View[] mPositionStrips;
public ConfigureAppearanceFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mAnimationDuration = getResources().getInteger(android.R.integer.config_shortAnimTime);
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
ViewGroup rootView = (ViewGroup) inflater.inflate(
R.layout.fragment_configure_appearance, container, false);
rootView.findViewById(R.id.container).setBackgroundColor(
AppearanceConfig.getHomescreenBackgroundColor(getActivity()));
mCurrentStyleNames.put(
AppearanceConfig.PREF_STYLE_TIME,
sp.getString(AppearanceConfig.PREF_STYLE_TIME,
AppearanceConfig.TIME_STYLE_NAMES[0]));
configureStylePager(
(ViewPager) rootView.findViewById(R.id.pager_time_style),
(PagerPositionStrip) rootView.findViewById(R.id.pager_time_position_strip),
AppearanceConfig.TIME_STYLE_NAMES, AppearanceConfig.COMPONENT_TIME,
Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, AppearanceConfig.PREF_STYLE_TIME);
mCurrentStyleNames.put(
AppearanceConfig.PREF_STYLE_DATE,
sp.getString(AppearanceConfig.PREF_STYLE_DATE,
AppearanceConfig.DATE_STYLE_NAMES[0]));
configureStylePager(
(ViewPager) rootView.findViewById(R.id.pager_date_style),
(PagerPositionStrip) rootView.findViewById(R.id.pager_date_position_strip),
AppearanceConfig.DATE_STYLE_NAMES, AppearanceConfig.COMPONENT_DATE,
Gravity.CENTER_HORIZONTAL | Gravity.TOP, AppearanceConfig.PREF_STYLE_DATE);
((ConfigurationActivity) getActivity()).setTranslucentActionBar(true);
return rootView;
}
@Override
public void onResume() {
super.onResume();
View rootView = getView();
if (rootView != null) {
mPositionStrips = new View[] {
rootView.findViewById(R.id.pager_time_position_strip),
rootView.findViewById(R.id.pager_date_position_strip)
};
for (View strip : mPositionStrips) {
strip.setAlpha(0f);
}
showPositionStrips(true, AUTO_HIDE_DELAY_MILLIS);
}
}
@Override
public void onPause() {
super.onPause();
final SharedPreferences.Editor sp = PreferenceManager
.getDefaultSharedPreferences(getActivity()).edit();
for (String key : mCurrentStyleNames.keySet()) {
sp.putString(key, mCurrentStyleNames.get(key));
}
sp.commit();
new BackupManager(getActivity()).dataChanged();
}
@Override
public void onDestroy() {
super.onDestroy();
// remove all scheduled runnables
mHidePositionStripRunnables.clear();
mHandler.removeCallbacksAndMessages(null);
}
private void configureStylePager(final ViewPager pager, final PagerPositionStrip positionStrip,
final String[] styleNames, final String styleComponent,
final int gravity, final String preference) {
String currentStyleName = mCurrentStyleNames.get(preference);
final LayoutInflater inflater = getActivity().getLayoutInflater();
pager.setAdapter(new PagerAdapter() {
@Override
public int getCount() {
return styleNames.length;
}
@Override
public boolean isViewFromObject(View view, Object o) {
return view == o;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
FrameLayout wrapper = new FrameLayout(getActivity());
ViewPager.LayoutParams wrapperLp = new ViewPager.LayoutParams();
wrapper.setLayoutParams(wrapperLp);
View v = inflater.inflate(
AppearanceConfig.getLayoutByStyleName(
getActivity(), styleComponent, styleNames[position]),
container, false);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
lp.gravity = gravity;
v.setLayoutParams(lp);
wrapper.addView(v);
container.addView(wrapper);
return wrapper;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
});
pager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
mCurrentStyleNames.put(preference, styleNames[position]);
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
positionStrip.setPosition(position + positionOffset);
}
});
positionStrip.setPageCount(styleNames.length);
pager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
showPositionStrips(true, -1);
break;
case MotionEvent.ACTION_UP:
showPositionStrips(false, AUTO_HIDE_DELAY_MILLIS);
break;
}
return false;
}
});
for (int i = 0; i < styleNames.length; i++) {
if (currentStyleName.equals(styleNames[i])) {
pager.setCurrentItem(i);
positionStrip.setPosition(i);
break;
}
}
}
private void showPositionStrips(final boolean show, final int hideDelay) {
// remove any currently scheduled runnables
mHandler.removeCallbacks(mHidePositionStripsRunnable);
// if show or hide immediately, take action now
if (show || hideDelay <= 0) {
for (View strip : mPositionStrips) {
strip.animate().cancel();
strip.animate().alpha(show ? 1f : 0f).setDuration(mAnimationDuration);
}
}
// schedule a hide if hideDelay > 0
if (hideDelay > 0) {
mHandler.postDelayed(mHidePositionStripsRunnable, hideDelay);
}
}
private Runnable mHidePositionStripsRunnable = new Runnable() {
@Override
public void run() {
showPositionStrips(false, 0);
}
};
@Override
public void onDetach() {
super.onDetach();
((ConfigurationActivity) getActivity()).setTranslucentActionBar(false);
}
}